package trabalho;

public class ListaDupla {

	private No ultimoNo;
	private No primeiroNo;
	private No ponteiro;
	private int tamanhoLista;
	
	
	public ListaDupla() {
		this.ultimoNo = null;
		this.primeiroNo = null;
		this.ponteiro = null;
		this.tamanhoLista = 0;
	}

	public void inserirElemento(No elemento){
		if(primeiroNo == null){
			primeiroNo = elemento;
			ponteiro = elemento;
			ultimoNo = elemento;
		}else{
			elemento.setProximo(primeiroNo);
			primeiroNo = elemento;
			ponteiro = elemento;
			elemento.getProximo().setAnterior(elemento);
		}
		
		tamanhoLista++;
	}
		
	public void inserirElemento(No elemento, int posicao){
		ponteiro = primeiroNo;

		for (int i = 1; i < posicao; i++) 
			ponteiro = ponteiro.getProximo();
		
		ponteiro.getAnterior().setProximo(elemento);
		elemento.setAnterior(ponteiro.getAnterior());
		ponteiro.setAnterior(elemento);
		elemento.setProximo(ponteiro);
		
		tamanhoLista++;
				
	}
	
	public No retornarElementoDaPosicao(int posicao){
		No noRetorno = primeiroNo;

		for (int i = 1; i < posicao; i++) 
			noRetorno = noRetorno.getProximo();
		
		return noRetorno;
	}
	
	public void excluirElemento(int posicao){
			
		ponteiro = primeiroNo;

		for (int i = 1; i < posicao; i++) 
			ponteiro = ponteiro.getProximo();
		
		if(ponteiro.getProximo() != null){
			ponteiro.getAnterior().setProximo(ponteiro.getProximo());
			ponteiro.getProximo().setAnterior(ponteiro.getAnterior());
		}
		else{
			ponteiro.getAnterior().setProximo(null);
		}	
		
		
		tamanhoLista--;
	}
	
	public void excluirTodosElementos(){
		ponteiro = null;
		ultimoNo = null;
		primeiroNo = null;
		tamanhoLista = 0;
	}
	
	public No proximo() {
		No no = ponteiro;
		if (ponteiro != null) {
			ponteiro = ponteiro.getProximo();
		}
		return no;
	}
	
	public No anterior() {
		No no =  ponteiro;
		if (ponteiro != null) {
			ponteiro = ponteiro.getAnterior();
		}
		return no;
	}
	
	public void reinicializarNoInicio() {
		ponteiro = primeiroNo;
	}
	
	public void reinicializarNoFim() {
		ponteiro = ultimoNo;
	}

	public No getUltimoNo() {
		return ultimoNo;
	}

	public void setUltimoNo(No ultimoNo) {
		this.ultimoNo = ultimoNo;
	}

	public No getPrimeiroNo() {
		return primeiroNo;
	}

	public void setPrimeiroNo(No primeiroNo) {
		this.primeiroNo = primeiroNo;
	}

	public No getPonteiro() {
		return ponteiro;
	}

	public void setPonteiro(No ponteiro) {
		this.ponteiro = ponteiro;
	}

	public int getTamanhoLista() {
		return tamanhoLista;
	}

	public void setTamanhoLista(int tamanhoLista) {
		this.tamanhoLista = tamanhoLista;
	}
}